﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SQLDMO;
using System.IO;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Nmo;
using Microsoft.SqlServer.Management.Smo.Agent;
using Microsoft.SqlServer.Management.Smo.Mail;
using Microsoft.SqlServer.Management.Smo;
using System.Threading;

namespace Connect
{
    public partial class CreateDB : Form
    {
        public CreateDB()
        {
            InitializeComponent();
        }
        string ServerName = "";
        string UserName = "";
        string Password = "";
        public CreateDB(string serverName, string uid, string pwd)
        {
            InitializeComponent();
            this.ServerName = serverName;
            this.UserName = uid;
            this.Password = pwd;

        }

        private void txtDatabase_Validated(object sender, EventArgs e)
        {
           
                    txtDatabase.Text = txtDatabase.Text.Replace(" ", "");
                    if (Connect.cnSQL.CheckDatabase(txtDatabase.Text) == true)
                    {
                        canhbao.BackgroundImage = baoloi.Images[1];
                        btncreate.Enabled = false;
                    }
                    else
                    {
                        canhbao.BackgroundImage = baoloi.Images[0];
                        btncreate.Enabled = true;
                    }
           
            
        }

        // Chọn đường dẫn để lưu file data và log
        private void panel2_Click(object sender, EventArgs e)
        {
           
            NoiLuuCSDL.ShowDialog();
            if (string.IsNullOrEmpty(NoiLuuCSDL.SelectedPath) == false)
            {
                txtPath.Text = (NoiLuuCSDL.SelectedPath + @"\Data\");

            }
        }

        private void txtDatabase_TextChanged(object sender, EventArgs e)
        {
            lbdata.Text = "Kích thước tệp tin dữ liệu " + txtDatabase.Text.Trim() + "_Data.mdf (MB) :";
            lblog.Text = "Kích thước tệp tin sử lý " + txtDatabase.Text.Trim() + "_Log.ldf (MB) :";
        }
        // Chọn đường dẫn đến file script
        private void panel3_Click(object sender, EventArgs e)
        {
            MoFileScript.ShowDialog();
            if (string.IsNullOrEmpty(MoFileScript.FileName) == true)
            {
                return;
                
            }
                txtscript.Text = MoFileScript.FileName;
        }

        Connection con = new Connection();
        public void createDatabase(string serverName, string uid, string pwd, string dataBase,string DataSize, string LogSize,string PathData, string PathScript)
        {
            System.IO.Directory.CreateDirectory(PathData);
            SQLServer gSQLServerDMO = new SQLServerClass();
            SQLDMO.Database nDatabase = new DatabaseClass();
            DBFile nDBFileData = new DBFileClass();
            SQLDMO.LogFile nLogFile = new LogFileClass();
            //try
            //{

                string sqlConnectionString = "";
                if (string.IsNullOrEmpty(uid) == false)
                {
                    gSQLServerDMO.Connect(serverName, uid, pwd);
                    sqlConnectionString = "Server = '" + serverName + "'; Initial Catalog = '" + dataBase + "'; user id = '" + uid + "'; pwd = '" + pwd + "'";
                }
                else
                {
                    gSQLServerDMO.LoginSecure = true;
                    gSQLServerDMO.Connect(serverName, null, null);
                    sqlConnectionString = "Server = '" + serverName + "'; Initial Catalog = '" + dataBase + "'; Integrated Security=SSPI;";
                }
                // Tạo file Data và Log
                nDatabase.Name = dataBase;
                nDBFileData.Name = dataBase;
                nDBFileData.PhysicalName = PathData + dataBase + "_Data.mdf";
                nDBFileData.PrimaryFile = true;

                nDBFileData.Size = int.Parse(DataSize);
                nDBFileData.FileGrowthType = SQLDMO_GROWTH_TYPE.SQLDMOGrowth_MB;
                nDBFileData.FileGrowth = 1;
                nDatabase.FileGroups.Item("PRIMARY").DBFiles.Add(nDBFileData);
                nLogFile.Name = dataBase + "Log";
                nLogFile.PhysicalName = PathData + dataBase + "_Log.ldf";
                nLogFile.Size = int.Parse(LogSize);
                nDatabase.TransactionLog.LogFiles.Add(nLogFile);
                gSQLServerDMO.Databases.Add(nDatabase);
                gSQLServerDMO.DisConnect();
                gSQLServerDMO.Close();
                // Chạy file Script
                // Đưa từng câu lệnh vào một mảng
                List<string> cmds = new List<string>();
                if (File.Exists(PathScript))
                {
                    TextReader tr = new StreamReader(PathScript);
                    string line = "";
                    string cmd = "";
                    while ((line = tr.ReadLine()) != null)
                    {
                        if (line.Trim().ToUpper() == "GO")
                        {
                            cmds.Add(cmd);
                            cmd = "";
                        }
                        else
                        {
                            cmd += line + "\r\n";
                        }
                    }
                    if (cmd.Length > 0)
                    {
                        cmds.Add(cmd);
                        cmd = "";
                    }
                    tr.Close();
                }
                // Thực thi các câu lệnh riêng lẻ

                if (cmds.Count > 0)
                {
                    //SqlCommand command = new SqlCommand();
                    //command.Connection = new SqlConnection(sqlConnectionString);
                    //command.CommandType = System.Data.CommandType.Text;
                    //command.Connection.Open();
                    //command.ExecuteNonQuery();
                    SqlConnection conn = new SqlConnection(sqlConnectionString);
                    Server server = new Server(new ServerConnection(conn));
                    Thread.Sleep(10000);
                    for (int i = 0; i < cmds.Count; i++)
                    {
                        server.ConnectionContext.ExecuteNonQuery(cmds[i]);
                    }


                }



            //}
            //catch (Exception)
            //{
 
            //}
        
        }
      
       
        private void btncancen_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btncreate_Click(object sender, EventArgs e)
        {

            try
            {
                if (string.IsNullOrEmpty(txtDatabase.Text)==true)
                {
                    MessageBox.Show("Bạn không được để trống tên cơ sở dữ liệu","Loi",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    return;
                }
                if (string.IsNullOrEmpty(txtPath.Text)==true)
                {
                    MessageBox.Show("Bạn phải chọn nơi lưu cơ sở dữ liệu","Loi",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    return;
                }
                if (string.IsNullOrEmpty(txtscript.Text)==true)
                {
                    MessageBox.Show("Bạn phải chọn nơi chứa file Script chạy tự động ","Loi",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    return;
                }
                this.ServerName = con.rosv();
                this.UserName = con.rous();
                this.Password = con.rops();
                createDatabase(this.ServerName, this.UserName, this.Password, txtDatabase.Text.Trim(),txtDataSize.Text.Trim(),txtLogSize.Text.Trim(), txtPath.Text.Trim(), txtscript.Text.Trim());

            }
            catch (Exception)
            {
                MessageBox.Show("Không thể tạo cơ sở dữ liệu ! Vui long kiểm tra lại.", "Khong thanh cong",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }

    }
}
